#include<iostream>
#include<pthread.h>
#include<vector>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<unistd.h>
#define NUM 10
using namespace std;

//__thread int number=0;
// __thread int pid=0;
// struct threadData
// {
//     string threadname;
// };
// void* threadRoutine(void* args)
// {
//     threadData* td=static_cast<threadData*>(args);  

//     return nullptr;
// }


// int main()
// {
//     //创建多线程
//     vector<pthread_t>tids;
//     for(int i=0;i<NUM;i++)
//     {
//         pthread_t tid;
//         threadData* td=new threadData;

//         pthread_create(&tid,nullptr,threadRoutine,td);
//         tids.push_back(tid);
//     }
    
//     // for(int i=0;i<tids.size();i++)
//     // {
//     //     pthread_join(tids[i],nullptr);
//     // }
//     for(auto i: tids)
//     {
//         pthread_detach(i);
//     }
//     return 0;
// }
#include"LockGuard.hpp"
#include<pthread.h>

pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
int tickets=2000;//用多线程，模拟一轮抢票
class threadData
{
public:
    threadData(int number,pthread_mutex_t* mutex)
    {
        threadname="thread-"+to_string(number);
        lock=mutex;
    }
public:
    string threadname;
    pthread_mutex_t* lock;
};
void* getTicket(void* args)
{
    threadData* td=static_cast<threadData*>(args);
    const char* name=td->threadname.c_str();
    while(true)
    {
        //pthread_mutex_lock(td->lock);//申请锁成功，才能往后执行，不成功 阻塞等待
        LockGuard lockguard(&lock);//临时的对象 RAII风格
        if(tickets>0)
        {
            printf("who=%s,get a tickst: %d\n",name,tickets);
            tickets--;
        }
        else {
            pthread_mutex_unlock(td->lock);
            break;
        }
        usleep(13);
    }
    printf("%s...is quit ",name);
    return nullptr;
    
}
int main()
{
    pthread_mutex_t lock;//锁
    pthread_mutex_init(&lock,nullptr);
    vector<pthread_t>tid;
    vector<threadData*>thread_data;
    for(int i=1;i<=NUM;i++)
    {
        pthread_t tds;
        threadData* td =new threadData(i,&lock);
        thread_data.push_back(td);
        pthread_create(&tds,nullptr,getTicket,thread_data[i-1]);
        tid.push_back(tds);
    }
    for(auto thread:tid)
    {
        //等待线程
        pthread_join(thread,nullptr);
    } 
    for(auto td:thread_data)
    {
        delete td;
    }
    
    return 0;
}